GradleによるTomcatサーバへのデプロイ
渡辺です。
本日は、JavaのWebアプリケーションをTomcatの動くEC2インスタンスへGradleを利用してデプロイする小ネタを紹介します。
EC2インスタンスの準備
はじめにTomcat(Tomcat8)が動作するEC2インスタンスを準備します。 Amazon Linuxを起動し、以下のスクリプトを流すか、UserDataに指定して起動してください。
#!/bin/bash -v yum -y update yum -y install java-1.8.0-openjdk-devel tomcat8 yum -y remove java-1.7.0-openjdk chkconfig tomcat8 on service tomat8 start
※現在のAmazon LinuxではデフォルトでJava7のJREのみがインストールされています(Amazon LinuxでJava8/Tomcat8の環境を構築する)
なお、今回はEIPを持つサーバとします。
Gradle
Gradle SSH pluginを使い、次のようにタスクを設定しましょう。
// build.gradle から抜粋 apply plugin: 'org.hidetake.ssh' buildscript { repositories { mavenCentral() jcenter() } dependencies { classpath 'org.hidetake:gradle-ssh-plugin:0.4.5' } } // Deploy to web server // https://gradle-ssh-plugin.github.io/ remotes { prd01 { host = 'X.X.X.X' user = 'ec2-user' knownHosts = allowAnyHosts identity = file('key.pem') } prd02 { host = 'X.X.X.X' user = 'ec2-user' knownHosts = allowAnyHosts identity = file('key.pem') } } task deployPrd(dependsOn: 'war') << { ssh.run { settings { pty = true } session([remotes.prd01, remotes.prd02]) { put war.archivePath.path, '/tmp/' executeSudo 'service tomcat8 stop' executeSudo "rm -rf /usr/share/tomcat8/webapps/ROOT" executeSudo "mv /tmp/${war.archiveName} /usr/share/tomcat8/webapps/ROOT.war" executeSudo 'service tomcat8 start' } } }
特に難しい点はないかと思います。 ここではコンテキストパスをルートにするため、warファイルの名前をROOT.warに変更していますが、サーバにWARを転送し、tomcatのwebappにwarファイルを配置し、再起動するだけです。 ステージング環境がある場合でも大きく変わらないでしょう。
まとめ
デプロイは可能な限り自動化しましょう。
2014.12.01追記
コメント欄で指摘があったので編集しました!ありがとうございます。